package com.haisen.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 *1.@EnableWebSocketMessageBroker注解表示开启使用STOMP协议来传输基于代理的消息，Broker就是代理的意思。
 *2.registerStompEndpoints方法表示注册STOMP协议的节点，并指定映射的URL。
 *3.stompEndpointRegistry.addEndpoint("/endpointSang").withSockJS();这一行代码用来注册STOMP协议节点，同时指定使用SockJS协议。
 *4.configureMessageBroker方法用来配置消息代理，由于我们是实现推送功能，这里的消息代理是/topic
 */

@Configuration
@EnableWebSocketMessageBroker
//通过EnableWebSocketMessageBroker 开启使用STOMP协议来传输基于代理(message broker)的消息,此
//此时浏览器支持使用@MessageMapping 就像支持@RequestMapping一样。
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Value("${webSocket.endpointB2C}")
    private String endpointB2C;
    @Value("${webSocket.endpointP2P}")
    private String endpointP2P;



    //添加这个Endpoint，这样在网页中就可以通过websocket连接上服务了
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        //注册一个Stomp 协议的endpoint,并指定 SockJS协议
        registry.addEndpoint(endpointB2C).withSockJS();
        //endPoint 注册协议节点,并映射指定的URl
        //注册一个名字为"endpointChat" 的endpoint,并指定 SockJS协议。点对点-用
        registry.addEndpoint(endpointP2P).withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代理(message broker)
        /**
         * config.enableSimpleBroker("/topic","/user");
         config.setApplicationDestinationPrefixes("/app");
         config.setUserDestinationPrefix("/user/");
         * config.enableSimpleBroker("/topic","/user");
         * 这句表示在topic和user这两个域上可以向客户端发消息；config.setUserDestinationPrefix("/user/");这句表示给指定用户发送（一对一）的主题前缀是“/user/”;  config.setApplicationDestinationPrefixes("/app"); 这句表示客户端向服务端发送时的主题上面需要加"/app"作为前缀；registry.addEndpoint("/webServer").withSockJS();这个和客户端创建连接时的url有关，后面在客户端的代码中可以看到。
         ---------------------
         作者：valenon
         来源：CSDN
         原文：https://blog.csdn.net/valenon/article/details/45892377
         版权声明：本文为博主原创文章，转载请附上博文链接！
         */

        //点对点/queue 消息代理,群发/topic
        registry.enableSimpleBroker("/queue","/topic");
        registry.setUserDestinationPrefix("/user/");
    }
}
